#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>

#define FUNCI 50
typedef void (*func_t)();
func_t funcv[FUNCI] = {NULL};

void sync_disk()
{
    printf("这是一个刷新数据的任务!\n");
}

void sync_log()
{
    printf("这是一个同步日志的任务!\n");
}

void net_send()
{
    printf("这是一个进行网络发送的任务!\n");
}

void load_task(func_t func)
{
	int i = 0;
	for(;i<FUNCI;i++)
	{			
		  if(funcv[i] == NULL)
			break;
	 
  }
    if(i == FUNCI)
    {
      printf("任务已满！\n");
      return;
    }
	funcv[i] = func;
}
void task_init()
{
	int i = 0;
	for(;i < FUNCI;i++)
	{
		funcv[i] = NULL;
	}
	load_task(sync_disk);
	load_task(sync_log);
	load_task(net_send);
}
void RunTask()
{
	int i = 0;
	for(;i<FUNCI;i++)
	{
		if(funcv[i])
    {
      funcv[i]();
    }
    else{
      break;
    }
	}
}
int main()
{
	pid_t id = fork();
	if(id == -1)
	{
		printf("创建子进程失败\n");
	}else if(id == 0)
	{
		int i = 5;
		while(i--)
		{
			printf("我是子进程，pid:%d，需要运行五次，已经运行%d次\n",getpid(),5-i);
			sleep(3);
		}
	}
	else
	{
		task_init();
		while(1)
		{
			int status = 0;
			pid_t ret = waitpid(id,&status,WNOHANG);
			if(ret == 0)
			{
				printf("无子进程退出！父进程继续执行\n");
				RunTask();
				sleep(1);
				continue;
			}
			else if(ret > 0)
			{
				if(WIFEXITED(status))
				{
					printf("子进程正常返回：pid:%d，进程退出码:%d\n",ret,WEXITSTATUS(status));
				}
				else
				{
					printf("子进程异常终止返回：pid:%d，%d号信号\n",ret,status&0x7f);
				}
			}
			else 
			{
				printf("等待子进程失败\n");
			}
      break;
		}
	}
}
